#ifndef _CLIST_H_
#define _CLIST_H_
#include <stdio.h>
#include <assert.h>

#define DataType int

//链表中一个节点的结构体
typedef struct cListNode {
    DataType data; // 值
    struct cListNode *Next; // 指向下一个结点
} cListNode;


// 初始化 ,构造一条空的链表
void cListInit(cListNode **ppFirst);

//打印链表
void cListPrint(cListNode *First);

//获取链表节点数
unsigned int cListNodeCount(cListNode *First);

// 尾部插入
void cListPushBack(cListNode **ppFirst, DataType data);

// 头部插入
void cListPushFront(cListNode **ppFirst, DataType data);

// 尾部删除
void cListPopBack(cListNode **ppFirst);

// 头部删除
void cListPopFront(cListNode **ppFirst);

// 给定结点插入，插入到结点前
void cListInsertForNode(cListNode **ppFirst, cListNode *pPos, DataType data);

//按位置插入
int cListInsert(cListNode **ppFirst, int Pos, DataType data);

// 给定结点删除
void cListEraseForNode(cListNode **ppFirst, cListNode *pPos);

// 按值删除，只删遇到的第一个
void cListRemove(cListNode **ppFirst, DataType data);

// 按值删除，删除所有的
void cListRemoveAll(cListNode **ppFirst, DataType data);

// 销毁 ，需要销毁每一个节点
void cListDestroy(cListNode **ppFirst);

// 按值查找，返回第一个找到的结点指针，如果没找到，返回 NULL
cListNode* cListFind(cListNode *pFirst, DataType data);

#endif 

